package message_api

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"giv-vue-blog/models/res"
	"strconv"
	"time"
)

type MessageRequst struct {
	SendUserID uint   `json:"send_user_id" binding:"required"`
	RevUserID  uint   `json:"rev_user_id" binding:"required"`
	Content    string `json:"content" binding:"required"`
}

// MessageCreateView 消息发送。
// @Summary 消息发送
// @Description 从当前用户发送消息给另一个用户
// @Tags 消息管理
// @Accept json
// @Produce json
// @Param data body MessageRequst true "消息请求参数"
// @Success 200 {object} res.Response{}
// @Failure 400 {object} res.Response "请求失败"
// @Router /api/msg [post]
func (MessageApi) MessageCreateView(c *gin.Context) {
	//当前用户发送消息
	var cr MessageRequst
	err := c.ShouldBindJSON(&cr)
	if err != nil {
		res.FailedWithError(err, &cr, c)
		return
	}
	//判断发送人和接收人是否存在
	var sendUser, recvUser models.UserModel
	err = global.DB.Take(&sendUser, cr.SendUserID).Error
	if err != nil {
		res.FailedWithMsg("接收消息的用户不存在", c)
		return
	}
	err = global.DB.Take(&recvUser, cr.RevUserID).Error
	if err != nil {
		res.FailedWithMsg("发送消息的用户不存在", c)
		return
	}
	//创建消息 并写入到数据库中和持久化到redis中，减轻数据库的压力
	msgModel := &models.MessageModel{
		SendUserID:       cr.SendUserID,
		SendUserNickName: sendUser.NickName,
		SendUserAvatar:   sendUser.Avatar,
		RevUserID:        cr.RevUserID,
		RevUserNickName:  recvUser.NickName,
		RevUserAvatar:    recvUser.Avatar,
		IsRead:           false,
		Content:          cr.Content,
	}
	//将消息保存到 Redis 中，使用发送者ID和接收者ID组成的键作为Redis的键
	key := strconv.Itoa(int(cr.SendUserID)) + "_" + strconv.Itoa(int(cr.RevUserID))
	value, _ := json.Marshal(msgModel)         // 将消息结构体序列化为 JSON 字符串
	global.Redis.Set(key, value, time.Hour*96) // 将消息字符串存储到 Redis 列表中  设置 Redis 键的过期时间为 96 小时

	err = global.DB.Create(msgModel).Error
	if err != nil {
		global.Log.Error("消息发送失败")
		res.FailedWithMsg("发送消息失败", c)
		return
	}

	res.OkWithMsg("消息发送成功", c)
}
